<?php
session_start();

// 设置允许的最大登录尝试次数
$maxAttempts = 5;
// 设置锁定时间（单位：秒）
$lockoutTime = 300;

// 存储IP地址和尝试次数的文件
$ipLogFile = 'ip_login_log.txt';

// 获取用户IP地址
$userIP = $_SERVER['REMOTE_ADDR'];

// 读取IP登录记录
$ipLoginLog = [];
if (file_exists($ipLogFile)) {
    $logContent = file_get_contents($ipLogFile);
    $ipLoginLog = json_decode($logContent, true);
}

// 如果IP地址不存在于记录中，初始化尝试次数和时间
if (!isset($ipLoginLog[$userIP])) {
    $ipLoginLog[$userIP] = [
        'attempts' => 0,
        'lastAttempt' => time()
    ];
}

// 检查是否已经记录了尝试次数和锁定时间
if (!isset($_SESSION['loginAttempts'])) {
    $_SESSION['loginAttempts'] = 0;
}
if (!isset($_SESSION['lockoutUntil'])) {
    $_SESSION['lockoutUntil'] = 0;
}

// 如果当前时间小于锁定时间，则禁止登录
if (time() < $_SESSION['lockoutUntil']) {
    // 将破解记录写入文件
    $logMessage = "IP: $userIP 尝试登录被锁定，时间: ". date('Y - m - d H:i:s'). "\n";
    file_put_contents('brute_force_log.txt', $logMessage, FILE_APPEND);
    echo "您的账号已被锁定，请稍后再试。";
    exit;
}

// 检查IP地址的尝试次数和时间间隔
if ($ipLoginLog[$userIP]['attempts'] >= 5 && time() - $ipLoginLog[$userIP]['lastAttempt'] < 300) {
    // 将破解记录写入文件
    $logMessage = "IP: $userIP 尝试登录被禁止，时间: ". date('Y - m - d H:i:s'). "\n";
    file_put_contents('brute_force_log.txt', $logMessage, FILE_APPEND);
    echo "您的IP地址已被暂时禁止访问，请稍后再试。";
    exit;
}

// 模拟的用户名和密码存储（实际应用中应使用更安全的方式，如数据库）
$validCredentials = [
    'admin' => '123456'
];

// 处理密码验证和文章添加逻辑
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $inputCaptcha = isset($_POST['captcha'])? $_POST['captcha'] : '';
    if (!isset($_SESSION['captcha']) || $inputCaptcha!== $_SESSION['captcha']) {
        // 将破解记录写入文件
        $logMessage = "IP: $userIP 验证码错误，时间: ". date('Y - m - d H:i:s'). "\n";
        file_put_contents('brute_force_log.txt', $logMessage, FILE_APPEND);
        echo "验证码错误，请重新输入。";
        exit;
    }

    // 获取用户输入的密码和用户名
    $inputPassword = isset($_POST['password'])? $_POST['password'] : '';
    $inputUsername = isset($_POST['username'])? $_POST['username'] : '';

    // 使用存储的用户名和密码进行验证
    if (isset($validCredentials[$inputUsername]) && $validCredentials[$inputUsername] === $inputPassword) {
        // 验证成功，重置尝试次数
        $_SESSION['loginAttempts'] = 0;
        $ipLoginLog[$userIP]['attempts'] = 0;

        // 处理文章数据
        $author = isset($_POST['author'])? $_POST['author'] : '';
        $title = isset($_POST['title'])? $_POST['title'] : '';
        $content = isset($_POST['content'])? $_POST['content'] : '';
        $template = isset($_POST['template'])? $_POST['template'] : 'default';
        $postTime = date('Y - m - d H:i:s');
        $category = isset($_POST['category'])? $_POST['category'] : '未分类';

        // 处理图片上传
        $targetDir = "uploads/";
        $fileName = basename($_FILES["image"]["name"]);
        $targetFile = $targetDir. $fileName;
        $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

        // 检查文件大小，设置为10MB
        $maxFileSize = 10 * 1024 * 1024;
        if ($_FILES["image"]["size"] > $maxFileSize) {
            echo "文件大小超过限制，最大允许上传10MB。";
            exit;
        }

        $uploadOk = 1;
        if (isset($_POST["submit"])) {
            $check = getimagesize($_FILES["image"]["tmp_name"]);
            if ($check!== false) {
                $uploadOk = 1;
            } else {
                echo "文件不是图片。";
                $uploadOk = 0;
            }
        }

        if (file_exists($targetFile)) {
            // 生成唯一文件名，防止文件覆盖
            $fileName = uniqid(). '_'. $fileName;
            $targetFile = $targetDir. $fileName;
        }

        if ($imageFileType!= "jpg" && $imageFileType!= "png" && $imageFileType!= "jpeg" && $imageFileType!= "gif") {
            echo "抱歉，仅支持 JPG, JPEG, PNG & GIF 图片文件。";
            $uploadOk = 0;
        }

        if ($uploadOk == 0) {
            echo "抱歉，你的文件未被上传。";
            $imagePath = '';
        } else {
            if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFile)) {
                $imagePath = 'uploads/'. $fileName;
            } else {
                echo "抱歉，上传文件失败。";
                $imagePath = '';
            }
        }

        // 根据选择的模板生成文章内容
        switch ($template) {
            case 'default':
                // 默认模板内容，即原来的模板
                $articleContent = '<html>
<head>
    <title>'.$title.'</title>
</head>
<body>
    <h1>'.$title.'</h1>
    <p>作者: '.$author.'</p>
    <p>发布时间: '.$postTime.'</p>
    <p>分类: '.$category.'</p>
    '.$content;
                if (!empty($imagePath)) {
                    $articleContent.= '<img src="'.$imagePath.'" alt="文章图片">';
                }
                $articleContent.= '</body>
</html>';
                break;
            case 'template1':
                // 简约风格模板
                $articleContent = '<html>
<head>
    <meta charset="UTF-8">
    <title>'.$title.'</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            padding: 20px;
        }
        h1 {
            color: #333;
        }
        p {
            color: #666;
        }
    </style>
</head>
<body>
    <h1>'.$title.'</h1>
    <p>作者: '.$author.'</p>
    <p>发布时间: '.$postTime.'</p>
    <p>分类: '.$category.'</p>
    '.$content;
                if (!empty($imagePath)) {
                    $articleContent.= '<img src="'.$imagePath.'" alt="文章图片" style="max-width:100%;height:auto;">';
                }
                $articleContent.= '</body>
</html>';
                break;
            case 'template2':
                // 杂志风格模板
                $articleContent = '<html>
<head>
    <meta charset="UTF-8">
    <title>'.$title.'</title>
    <style>
        body {
            font-family: "Times New Roman", Times, serif;
            line-height: 1.8;
            padding: 30px;
        }
        h1 {
            color: #004d99;
            text-align: center;
            text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
        }
        p {
            color: #333;
        }
       .article-image {
            display: block;
            margin: 20px auto;
            max-width: 80%;
            box-shadow: 3px 3px 5px rgba(0,0,0,0.2);
        }
    </style>
</head>
<body>
    <h1>'.$title.'</h1>
    <p>作者: '.$author.'</p>
    <p>发布时间: '.$postTime.'</p>
    <p>分类: '.$category.'</p>
    '.$content;
                if (!empty($imagePath)) {
                    $articleContent.= '<img src="'.$imagePath.'" alt="文章图片" class="article-image">';
                }
                $articleContent.= '</body>
</html>';
                break;
            case 'template3':
                // 现代卡片风格模板
                $articleContent = '<html>
<head>
    <meta charset="UTF-8">
    <title>'.$title.'</title>
    <style>
        body {
            font-family: "Roboto", sans-serif;
            background-color: #f4f4f4;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            margin: 0;
        }
       .article-card {
            background-color: #fff;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
            border-radius: 10px;
            padding: 30px;
            width: 80%;
            max-width: 600px;
        }
        h1 {
            color: #2196F3;
            margin-top: 0;
        }
        p {
            color: #555;
        }
       .article-image {
            width: 100%;
            border-radius: 5px;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="article-card">
        <h1>'.$title.'</h1>
        <p>作者: '.$author.'</p>
        <p>发布时间: '.$postTime.'</p>
        <p>分类: '.$category.'</p>
        '.$content;
                if (!empty($imagePath)) {
                    $articleContent.= '<img src="'.$imagePath.'" alt="文章图片" class="article-image">';
                }
                $articleContent.= '</div>
</body>
</html>';
                break;
            default:
                // 默认模板内容
                $articleContent = '<html>
<head>
    <title>'.$title.'</title>
</head>
<body>
    <h1>'.$title.'</h1>
    <p>作者: '.$author.'</p>
    <p>发布时间: '.$postTime.'</p>
    <p>分类: '.$category.'</p>
    '.$content;
                if (!empty($imagePath)) {
                    $articleContent.= '<img src="'.$imagePath.'" alt="文章图片">';
                }
                $articleContent.= '</body>
</html>';
        }

        // 生成唯一文件名，避免冲突，这里使用时间戳
        $uniqueTitle = time(). '_'. str_replace(' ', '_', $title). '.html';
        $filePath = 'blog/'. $uniqueTitle;
        if (file_put_contents($filePath, $articleContent)) {
            echo "文章添加成功";
        } else {
            echo "文章保存失败";
        }
    } else {
        // 验证失败，增加尝试次数
        $_SESSION['loginAttempts']++;
        $ipLoginLog[$userIP]['attempts']++;
        $ipLoginLog[$userIP]['lastAttempt'] = time();
        if ($_SESSION['loginAttempts'] >= $maxAttempts) {
            // 达到最大尝试次数，锁定账号
            $_SESSION['lockoutUntil'] = time() + $lockoutTime;
            // 将破解记录写入文件
            $logMessage = "IP: $userIP 尝试登录达到最大次数被锁定，时间: ". date('Y - m - d H:i:s'). "\n";
            file_put_contents('brute_force_log.txt', $logMessage, FILE_APPEND);
            echo "您的账号已被锁定，请稍后再试。";
        } else {
            // 将破解记录写入文件
            $logMessage = "IP: $userIP 用户名或密码错误，时间: ". date('Y - m - d H:i:s'). "\n";
            file_put_contents('brute_force_log.txt', $logMessage, FILE_APPEND);
            echo "用户名或密码错误";
        }
    }
}

// 保存IP登录记录
file_put_contents($ipLogFile, json_encode($ipLoginLog));
?>
